/**
 * text-ellipsis 多行省略功能CSS规则模块
 * @version 1.1.0
 * @description 支持 text-ellipsis-*num 和 text-ellipsis-*[num] 格式
 * 跨平台兼容：Web、App、小程序、鸿蒙
 * @updated 根据 uni-app-x CSS 文档更新平台兼容性
 */

import { utils } from '../../../utils/utils.js';

/**
 * 处理 text-ellipsis 相关的CSS规则
 * @param {string} className - 类名
 * @param {object} options - 配置选项
 * @returns {object|string|null} - 生成的CSS样式对象或条件编译CSS字符串
 */
export function processTextEllipsisRules(className, options = {}) {
    const { platform = 'H5', h5Unit = 'rem', remBase = 16, generateConditional = false, compileAllPlatforms = true } = options;
    
    // text-ellipsis-*num 和 text-ellipsis-*[num] 功能
    // 匹配 text-ellipsis-1, text-ellipsis-[2] 等格式
    const textEllipsisMatch = className.match(/^text-ellipsis-(\d+|\[\d+\])$/);
    if (textEllipsisMatch) {
        let numValue = textEllipsisMatch[1];
        
        // 处理方括号语法 [2] -> 2
        if (numValue.startsWith('[') && numValue.endsWith(']')) {
            numValue = numValue.slice(1, -1);
        }
        
        const lines = parseInt(numValue);
        
        // 检查是否为有效的行数（1-10行）
        if (lines >= 1 && lines <= 10) {
            // 如果需要生成条件编译CSS，返回条件编译字符串
            if (generateConditional) {
                return generateConditionalCSS(lines, className, { compileAllPlatforms });
            }
            // 否则返回单平台CSS对象
            return generateTextEllipsisCSS(lines, platform);
        }
    }
    
    return null;
}

/**
 * 根据平台生成对应的文本省略CSS
 * @param {number} lines - 行数
 * @param {string} platform - 平台标识
 * @returns {object} - CSS样式对象
 */
function generateTextEllipsisCSS(lines, platform) {
    // 根据不同平台生成适配的CSS
    if (platform === 'H5' || platform === 'WEB' || platform === 'web' ||
        platform === 'MP-WEIXIN' || platform === 'MP-ALIPAY' || 
        platform === 'MP-BAIDU' || platform === 'MP-TOUTIAO' || platform === 'MP-QQ' ||
        platform === 'MP-KUAISHOU' || platform === 'MP-DINGTALK' || platform === 'MP-XIAO-HONG-SHU') {
        // Web端和小程序端使用CSS方案
        if (lines === 1) {
            // 单行省略
            return {
                'overflow': 'hidden',
                'text-overflow': 'ellipsis',
                'white-space': 'nowrap'
            };
        } else {
            // 多行省略 - 使用webkit方案（Web端和现代小程序都支持）
            return {
                'overflow': 'hidden',
                'text-overflow': 'ellipsis',
                'display': '-webkit-box',
                '-webkit-line-clamp': lines.toString(),
                '-webkit-box-orient': 'vertical'
            };
        }
    } else if (platform === 'APP-PLUS' || platform === 'APP-ANDROID' || 
               platform === 'APP-IOS' || platform === 'app' ||
               platform === 'MP-HARMONY' || platform === 'harmony') {
        // App端和鸿蒙端使用lines属性（uni-app-x 原生支持）
        if (lines === 1) {
            // 单行省略 - 原生端可以同时使用lines和text-overflow
            return {
                'lines': 1,
                'text-overflow': 'ellipsis',
                'overflow': 'hidden'
            };
        } else {
            // 多行省略 - 原生端使用lines属性
            return {
                'lines': lines,
                'text-overflow': 'ellipsis',
                'overflow': 'hidden'
            };
        }
    } else {
        // 其他平台回退方案
        if (lines === 1) {
            return {
                'overflow': 'hidden',
                'text-overflow': 'ellipsis',
                'white-space': 'nowrap'
            };
        } else {
            // 多行省略回退方案
            return {
                'overflow': 'hidden',
                'text-overflow': 'ellipsis'
            };
        }
    }
}

/**
 * 生成条件编译CSS
 * @param {number} lines - 行数
 * @param {string} originalClassName - 原始类名（可能包含方括号）
 * @param {Object} options - 选项配置
 * @returns {string} - 带条件编译的CSS字符串
 */
export function generateConditionalCSS(lines, originalClassName, options = {}) {
    const { compileAllPlatforms = true } = options;
    const className = originalClassName;
    
    // 处理方括号需要转义
    const escapedClassName = className.replace(/\[/g, '\\[').replace(/\]/g, '\\]');
    
    // 如果不编译全端，只生成当前运行环境的代码
    if (!compileAllPlatforms) {
        const currentPlatform = detectCurrentPlatform();
        return generateSinglePlatformCSS(lines, escapedClassName, currentPlatform);
    }
    
    // 编译全端代码（更新版本）
    let css = `\n/* ${className} - 多行文本省略 */\n`;
    
    // Web平台
    css += `/* #ifdef H5 */\n`;
    css += `.${escapedClassName} {\n`;
    css += `  overflow: hidden;\n`;
    css += `  text-overflow: ellipsis;\n`;
    if (lines === 1) {
        css += `  white-space: nowrap;\n`;
    } else {
        css += `  display: -webkit-box;\n`;
        css += `  -webkit-line-clamp: ${lines};\n`;
        css += `  -webkit-box-orient: vertical;\n`;
    }
    css += `}\n`;
    css += `/* #endif */\n\n`;
    
    // 小程序平台（扩展更多小程序支持）
    css += `/* #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-KUAISHOU || MP-DINGTALK || MP-XIAO-HONG-SHU */\n`;
    css += `.${escapedClassName} {\n`;
    css += `  overflow: hidden;\n`;
    css += `  text-overflow: ellipsis;\n`;
    if (lines === 1) {
        css += `  white-space: nowrap;\n`;
    } else {
        css += `  display: -webkit-box;\n`;
        css += `  -webkit-line-clamp: ${lines};\n`;
        css += `  -webkit-box-orient: vertical;\n`;
    }
    css += `}\n`;
    css += `/* #endif */\n\n`;
    
    // App平台（包含Android和iOS）
    css += `/* #ifdef APP-PLUS || APP-ANDROID || APP-IOS */\n`;
    css += `.${escapedClassName} {\n`;
    css += `  lines: ${lines};\n`;
    css += `  text-overflow: ellipsis;\n`;
    css += `  overflow: hidden;\n`;
    css += `}\n`;
    css += `/* #endif */\n\n`;
    
    // 鸿蒙平台
    css += `/* #ifdef MP-HARMONY */\n`;
    css += `.${escapedClassName} {\n`;
    css += `  lines: ${lines};\n`;
    css += `  text-overflow: ellipsis;\n`;
    css += `  overflow: hidden;\n`;
    css += `}\n`;
    css += `/* #endif */\n`;
    
    return css;
}

/**
 * 生成单平台CSS
 * @param {number} lines - 行数
 * @param {string} escapedClassName - 转义后的类名
 * @param {string} platform - 平台标识
 * @returns {string} - 单平台CSS字符串
 */
function generateSinglePlatformCSS(lines, escapedClassName, platform) {
    let css = `.${escapedClassName} {\n`;
    css += `  overflow: hidden;\n`;
    css += `  text-overflow: ellipsis;\n`;
    
    if (platform === 'app' || platform === 'harmony') {
        // App和鸿蒙平台使用lines属性
        css += `  lines: ${lines};\n`;
    } else {
        // Web和小程序平台使用CSS方案
        if (lines === 1) {
            css += `  white-space: nowrap;\n`;
        } else {
            css += `  display: -webkit-box;\n`;
            css += `  -webkit-line-clamp: ${lines};\n`;
            css += `  -webkit-box-orient: vertical;\n`;
        }
    }
    
    css += `}`;
    return css;
}

/**
 * 检测当前运行环境
 * @returns {string} 当前平台标识 'web' | 'mp' | 'app' | 'harmony'
 */
function detectCurrentPlatform() {
    // 检测当前运行环境
    if (typeof window !== 'undefined') {
        // 浏览器环境
        return 'web';
    } else if (typeof wx !== 'undefined' || typeof my !== 'undefined' || 
               typeof swan !== 'undefined' || typeof tt !== 'undefined' || 
               typeof qq !== 'undefined' || typeof ks !== 'undefined') {
        // 小程序环境
        return 'mp';
    } else if (typeof harmony !== 'undefined' || 
               (typeof globalThis !== 'undefined' && globalThis.harmony)) {
        // 鸿蒙环境
        return 'harmony';
    } else if (typeof plus !== 'undefined' || typeof uni !== 'undefined') {
        // App环境
        return 'app';
    } else {
        // 默认返回Web
        return 'web';
    }
}

/**
 * 批量生成所有支持的text-ellipsis类名的条件编译CSS
 * @returns {string} - 完整的条件编译CSS字符串
 */
export function generateAllTextEllipsisCSS() {
    let css = `\n/* text-ellipsis 多行省略功能 - 条件编译版本 */\n`;
    css += `/* 支持 text-ellipsis-1 到 text-ellipsis-10 */\n`;
    css += `/* 支持 text-ellipsis-[1] 到 text-ellipsis-[10] */\n`;
    
    // 生成1-10行的所有CSS
    for (let i = 1; i <= 10; i++) {
        css += generateConditionalCSS(i, `text-ellipsis-${i}`);
        css += '\n';
        
        // 为方括号语法也生成CSS
        css += generateConditionalCSS(i, `text-ellipsis-[${i}]`);
        css += '\n';
    }
    
    return css;
} 